/**
 * 云函数调用辅助类
 */

const util = require('../helpers/util.js');

// 云函数名
const CLOUD_FUNCTION_NAME = 'mcloud';

// 云函数路径前缀
const PID = 'oa';

/**
 * 获取请求参数
 * @param {String} route 路由
 * @param {Object} params 参数
 */
function _getParams(route, params = {}) {
    return {
        route,
        params,
        PID
    };
}

/**
 * 调用云函数
 * @param {String} route 路由
 * @param {Object} params 参数
 * @param {Boolean} showLoading 是否显示加载提示
 * @param {String} title 加载提示文字
 */
async function callCloud(route, params = {}, showLoading = true, title = '加载中') {
    if (showLoading) {
        wx.showLoading({ title, mask: true });
    }
    
    try {
        // 准备调用参数
        const callParams = _getParams(route, params);
        
        console.log('[CLOUD] 发送请求：', route, params);
        
        // 调用云函数
        const result = await wx.cloud.callFunction({
            name: CLOUD_FUNCTION_NAME,
            data: callParams
        });
        
        console.log('[CLOUD] 请求成功：', route, result.result);
        
        if (showLoading) {
            wx.hideLoading();
        }
        
        if (result && result.result) {
            return result.result;
        } else {
            return {
                code: -1,
                msg: '云函数调用异常'
            };
        }
    } catch (error) {
        console.error('[CLOUD] 请求异常：', route, error);
        
        if (showLoading) {
            wx.hideLoading();
        }
        
        return {
            code: -1,
            msg: '系统繁忙，请稍后重试'
        };
    }
}

/**
 * 调用云函数（数据操作）
 * @param {String} route 路由
 * @param {Object} params 参数
 * @param {Boolean} showLoading 是否显示加载提示
 * @param {String} title 加载提示文字
 */
async function callCloudData(route, params = {}, showLoading = true, title = '加载中') {
    const MAX_RETRY = 3;
    let retryCount = 0;
    let result = null;
    
    console.log('[CLOUD DATA] 调用云函数开始：', route, params);
    
    while (retryCount < MAX_RETRY) {
        result = await callCloud(route, params, showLoading, title);
        
        if (result.code === 0) {
            return result.data;
        }
        
        // 记录错误
        console.log(`[CLOUD DATA] 第${retryCount + 1}次调用失败：`, route, result);
        
        retryCount++;
        
        if (retryCount < MAX_RETRY) {
            console.log(`[CLOUD DATA] ${retryCount}秒后重试...`);
            await new Promise(resolve => setTimeout(resolve, retryCount * 1000));
        }
    }
    
    console.log(`[CLOUD DATA] 达到最大重试次数，调用失败：`, route);
    return null;
}

/**
 * 调用云函数（提交操作）
 * @param {String} route 路由
 * @param {Object} params 参数
 * @param {String} title 加载提示文字
 */
async function callCloudSumbit(route, params = {}, title = '提交中') {
    const result = await callCloud(route, params, true, title);
    
    if (result.code === 0) {
        wx.showToast({
            title: '操作成功',
            icon: 'success'
        });
        return result.data;
    } else {
        wx.showModal({
            title: '操作失败',
            content: result.msg || '系统繁忙，请稍后重试',
            showCancel: false
        });
        return null;
    }
}

module.exports = {
    callCloud,
    callCloudData,
    callCloudSumbit
}; 